/**
* @file main.c
* @author khayati nadhir
* @version 1.0
* @date 20 Mars 2014
* @brief Projet d'initiation aux bonnes pratiques de développement en C avec SDL 
*/
#include <stdlib.h>
#include <stdio.h>
#include <SDL/SDL.h>
#include <SDL/SDL_mixer.h>
#include <SDL/SDL_ttf.h>

/* setPosition : permet d'initialiser un rect avec une des coordonnées x et y */

/**
* @fn void setPosition(SDL_Rect* position, int x, int y);
* @details permet d'initialiser un rect avec une des coordonnées x et y
* @param position
Un pointeur sur la structure SDL_Rect
* @param x
Un entier 
* @param y
Un entier
* @return void */
void setPosition(SDL_Rect* position, int x, int y);

/* loadBMP : permet de charger une image correctement sinon elle quitte le jeu */
/**
* @fn void loadBMP(SDL_Surface** surface, char* uri);
* @details permet de charger une image correctement sinon elle quitte le jeu
* @param surface
Un pointeur de pointeur sur la structure SDL_Rect
* @param uri
Un pointeur sur une chaine de caractére 
* @return void */
void loadBMP(SDL_Surface** surface, char* uri);

/* onButtonLeftClick : permet de bien detecter le click sur une image bien déterminée */
/**
* @fn int onButtonLeftClick(SDL_Event event, SDL_Surface* surface, SDL_Rect position);
* @details permet de bien detecter le click sur une image bien déterminée
* @param event
Une variable de type SDL_Event
* @param surface
Un pointeur de pointeur sur la structure SDL_Surface
* @param position
Une variable sur la structure SDL_Rect
* @return int */
int onButtonLeftClick(SDL_Event event, SDL_Surface* surface, SDL_Rect position);

int main( int argc, char *argv[] )
{

        /* *********** BEGIN déclaration des variables ************* */

/* les Surfaces nécessaires pour notre jeu (bouttons, image, texte et écran) */
SDL_Surface *imageButton, *textButton, *soundButton, *catImage, *catName, *screen;

/* les Rect associés pour chaque Surfaces */
SDL_Rect posImageButton, posTextButton, posSoundButton, posCatImage, posCatName;

TTF_Font *textFont;

Mix_Music *catSound;

SDL_Color textColor = {255, 255, 255}, textBgColor = {255, 0, 0};

SDL_Event event;

int  gameStarted = 1, isShownCatImage = 0, isShownCatName = 0, isPlayingSound = 0;
/* *********** END déclaration des variables ************* */

/* *********** BEGIN initialisation de "l'environnement" SDL ************* */

if( SDL_Init( SDL_INIT_VIDEO ) == -1 )
    {
        printf( "Can't init SDL:  %s\n", SDL_GetError( ) );
        return EXIT_FAILURE;
    }

    atexit( SDL_Quit );
    screen = SDL_SetVideoMode( 800, 700, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
    
    if( screen == NULL )
    {
        printf( "Can't set video mode: %s\n", SDL_GetError( ) );
        return EXIT_FAILURE;
    }

	 //Initialisation de l'API Mixer
    if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, MIX_DEFAULT_CHANNELS, 1024) == -1) //Initialisation de l'API Mixer
    {
        printf("%s", Mix_GetError());
        return EXIT_FAILURE;
    }
	catSound = Mix_LoadMUS("sound/chat.ogg");
if(catSound== NULL)
    {
        printf("Erreur loading sound chat.ogg : %s",Mix_GetError());
        exit(-1);
    }

    if(TTF_Init() == -1)
    {
        printf("Erreur d'initialisation de TTF_Init : %s\n", TTF_GetError());
        return EXIT_FAILURE;
    }
	textFont = TTF_OpenFont("fonts/ComicPerso.ttf", 90);
	if(textFont== NULL)
    {
        printf("Erreur loading font ComicPerso.ttf : %s",TTF_GetError());
        exit(-1);
    }
/* *********** END initialisation de "l'environnement" SDL ************* */

/* *********** BEGIN initialisation des coordonées des surfaces ************* */
setPosition(&posImageButton, 0, 0);
setPosition(&posTextButton, 0, 600);
setPosition(&posSoundButton, 700, 600);
setPosition(&posCatImage, 0, 0);

/* *********** END initialisation des coordonées des surfaces ************* */

/* *********** BEGIN Chargement des images ************* */
loadBMP(&imageButton, "img/chatbt.bmp");
loadBMP(&textButton, "img/chatbtClic.bmp");
loadBMP(&soundButton, "img/play_sound.bmp");
loadBMP(&catImage, "img/chat.bmp");

/* *********** END Chargement des images ************* */


/* *********** BEGIN Game Loop ************* */
while (gameStarted)
    {
/* Remplissage de la couleur du Background */
SDL_FillRect(screen, 0, SDL_MapRGB(screen->format, 255,255, 255));

/* ********* BEGIN récupération des événements ************ */
       
      while(SDL_PollEvent(&event))
        {
            switch (event.type)
            {
            case SDL_QUIT:
                gameStarted = 0;
                break;
	case SDL_MOUSEBUTTONDOWN :
	if(onButtonLeftClick(event, imageButton, posImageButton) == 1){
       		isShownCatImage=1;
	}

	if(onButtonLeftClick(event, textButton, posTextButton) == 1){
       		isShownCatName=1;
	}

	if(onButtonLeftClick(event, soundButton, posSoundButton) == 1){
       		isPlayingSound=1;
	}
            
	}
}

/* ********* END récupération des événements ************ */

/* ********* BEGIN exécution des traitements ************ */

if(isPlayingSound ==1){
   Mix_PlayMusic(catSound, 0); //Jouer Meow
	isPlayingSound = 0;
}



if(isShownCatImage==1){
SDL_BlitSurface(catImage, NULL, screen, &posCatImage);
}

if(isShownCatName==1){
catName = TTF_RenderText_Shaded(textFont, "Chat", textColor, textBgColor);
posCatName.x = (screen->w - catName->w)/2;
posCatName.y = screen->h-(catName->h+10);
SDL_BlitSurface(catName, NULL, screen, &posCatName);
}

SDL_BlitSurface(imageButton, NULL, screen, &posImageButton);
SDL_BlitSurface(textButton, NULL, screen, &posTextButton);
SDL_BlitSurface(soundButton, NULL, screen, &posSoundButton);

/* ********** Mise à jour de l'écran (la derniére chose avant la fin du Game Loop) ************* */
SDL_Flip(screen);

/* ********* END exécution des traitements ************ */
}

/* *********** END Game Loop ************* */

/* BEGIN Libération de la mémoire avant de quitter le jeu */

SDL_FreeSurface(imageButton);
SDL_FreeSurface(textButton);
SDL_FreeSurface(soundButton);
SDL_FreeSurface(catImage);
SDL_FreeSurface(screen);
TTF_CloseFont(textFont); /* Doit être avant TTF_Quit() */
TTF_Quit();
return EXIT_SUCCESS;

/* END Libération de la mémoire avant de quitter le jeu */
}

/* BEGIN Les Fonctions */

void setPosition(SDL_Rect* position, int x, int y){
	position->x = x;
	position->y = y;
}

void loadBMP(SDL_Surface** surface, char* uri){
	*surface = SDL_LoadBMP(uri);
	if(*surface == NULL)
		{
			printf("Error Loading %s : %s\n", uri, SDL_GetError( ));
			exit(-1);
		}
}

int onButtonLeftClick(SDL_Event event, SDL_Surface* surface, SDL_Rect position){	
	if((event.button.button == SDL_BUTTON_LEFT)&& (event.button.x>position.x) && (event.button.x <(position.x+surface->w)) && (event.button.y>position.y) &&(event.button.y<position.y+surface->h))
	return 1;
return 0;
}

/* END Les Fonctions */
